package com.softeem.idriveserver.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.softeem.idriveserver.dto.Result;
import com.softeem.idriveserver.entity.Admin;
import com.softeem.idriveserver.entity.User;
import com.softeem.idriveserver.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

@Tag(name = "用户管理")
@RestController
public class UserController {

    @Autowired
    private UserService userService;


    /**
     * 分页查询用户列表
     * @param page  当前页码
     * @param limit 每页数据条数
     * @return
     */
    @Operation(summary = "用户列表",description = "分页查询用户列表")
    @GetMapping("/user/list/{page}/{limit}")
    public Result list(@PathVariable Integer page, @PathVariable Integer limit){
        //分页查询
       List<User> users =  userService.list(new Page<>(page,limit));
       return Result.ok().setData(users).setMsg("查询成功");
    }

    //用户登录
    @Operation(summary = "用户登录",description = "需要提供账号和密码")
    @Parameters({
            @Parameter(name = "phone", description = "账号", required = true),
            @Parameter(name = "password", description = "密码", required = true)
    })
    @GetMapping("/user/login")
    public Result login(@RequestParam String phone, @RequestParam String password){
        //根据手机号查询是否存在用户
        User user = userService.getOne(Wrappers.query(User.class).eq("phone", phone));
        if(user == null){
            return Result.fail().setMsg("该账号不存在");
        }
        //对比密码（输入的密码+查询到的token组合加密最后对比）
        if(!SecureUtil.md5(password + user.getToken()).equals(user.getPassword())){
            return Result.fail().setMsg("密码错误");
        }
        //判断账号可用性
        if(user.getStatus() == 0){
            return Result.fail().setMsg("账号禁用");
        }
        return Result.ok().setMsg("登录成功").setData(user);
    }

    //用户注册
    @Operation(summary = "用户注册",description = "需要提供账号和密码")
    @Parameters({
            @Parameter(name = "phone", description = "账号", required = true),
            @Parameter(name = "password", description = "密码", required = true)
    })
    @PostMapping("/user/reg")
    public Result registry(@RequestParam String phone, @RequestParam String password){
        //检查用户是否存在
        //创建查询条件包装器(select * from user)
        QueryWrapper<User> query = Wrappers.query(User.class);
        //设置查询条件（where phone=?）
        query.eq("phone",phone);
        //执行条件查询
        User user = userService.getOne(query);
        if(user != null){
            return Result.fail().setMsg("该账号已存在");
        }
        //对密码加盐加密
        //生成随机盐
        String token = RandomUtil.randomString(16);
        //将输入的密码和随机盐组合
        password = password + token;
        //使用md5对组合后的密码加密
        password = SecureUtil.md5(password);
        user = new User();
        user.setPhone(phone);
        user.setPassword(password);
        //记录生成的随机盐
        user.setToken(token);
        boolean b = userService.save(user);
        return b ? Result.ok().setMsg("注册成功") : Result.fail().setMsg("注册失败");
    }

    //信息修改
    @Operation(summary = "修改账号信息",description = "修改账号信息")
    @PutMapping("/user")
    public Result modify(@RequestBody User user){
        if(user.getId() == null){
            return Result.fail().setMsg("请提供用户id");
        }
        //根据id查询用户
        User oldUser = userService.getById(user.getId());
        if(Objects.isNull(oldUser)){
            return Result.fail().setMsg("用户不存在");
        }
        //检查是否提供了密码（是否需要修改密码）
        if(Objects.nonNull(user.getPassword())){
            //修改的密码是否和原密码一致
            if(Objects.equals(oldUser.getPassword(),SecureUtil.md5(user.getPassword()+oldUser.getToken()))){
                return Result.fail().setMsg("新密码与原密码一致");
            }
            //修改密码
            //生成新的随机盐
            String token = RandomUtil.randomString(16);
            String password = user.getPassword() + token;
            password = SecureUtil.md5(password);
            user.setPassword(password);
            user.setToken(token);
        }
        //根据用户ID修改用户信息
        boolean b = userService.updateById(user);
        return b ? Result.ok().setMsg("修改成功") : Result.fail().setMsg("修改失败");
    }

    // 根据ID查询用户
    // 通过GET请求访问/user/queryById，传入用户ID作为查询参数
    @Operation(summary = "根据ID查询用户",description = "根据ID查询用户")
    @GetMapping("/user/{id}")
    public Result queryById(@PathVariable Integer id){
        // 调用userService的getById方法，根据ID获取用户信息
        User user = userService.getById(id);
        // 判断用户是否存在，如果存在则返回成功结果，否则返回失败结果
        return user != null ? Result.ok().setData(user) : Result.fail().setMsg("用户不存在");
    }

    /**
     * 根据提供手机号模糊查询用户信息，并对结果集分页显示
     */
    @Operation(summary = "根据手机号模糊查询用户信息",description = "根据手机号模糊查询用户信息")
    @GetMapping("/user/phone/{phone}/{page}/{limit}")
    public Result queryByPhone(@PathVariable String phone,
                               @PathVariable Integer page,
                               @PathVariable Integer limit){
        return Result.ok().setData(userService.list(new Page<>(page,limit),Wrappers.query(User.class).like("phone",phone)));
    }

    /**
     * 处理用户删除请求
     *
     * @param id 用户ID
     * @return 删除操作的结果
     */
    @Operation(summary = "删除用户",description = "根据id删除用户")
    @DeleteMapping("/user/{id}")
    public Result delete(@PathVariable Integer id){
        // 根据ID删除用户，返回操作结果
        return userService.removeById(id) ? Result.ok().setMsg("删除成功") : Result.fail().setMsg("删除失败");
    }

    /**
     * 根据id集合批量删除用户
     */
    @Operation(summary = "批量删除",description = "根据提供的id集合删除符合条件的数据")
    @DeleteMapping("/user")
    public Result batchDelete(@RequestBody Integer[] ids){
        // 根据id集合批量删除用户，返回操作结果
        return userService.removeByIds(Arrays.asList(ids)) ? Result.ok().setMsg("批量删除成功") : Result.fail().setMsg("批量删除失败");
    }

}
